package net.vsame.url2sql.web.bigpipe;

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 原BigpipeDataHelper, 简写为D
 * code = 0: 正确返回 <br/>
 * code > 0: 业务---调用API时发生错误。<br/>
 * -20 <= code <= -1: 基础错误。<br/>
 * code <-50: 其它系统内部错误。<br/>
 * @author gaolei
 *
 */
public class BigpipeDataHelper {
	
	private static ThreadLocal<Map<String, Object>> maps = new ThreadLocal<Map<String, Object>>();
	private static Log log = LogFactory.getLog(BigpipeDataHelper.class);
	
	/**
	 * 取的当前Map 此方法会传递出Map的引用,请谨慎使用!!!
	 * @return
	 */
	static Map<String, Object> map(){
		Map<String, Object> retVal = maps.get();
		if(retVal == null){
			retVal = new LinkedHashMap<String, Object>();
			maps.set(retVal);
			retVal.put("code", 0);
			retVal.put("msg", "success");
		}
		return retVal;
	}
	
	/**
	 * 如果包含错误(即code!=0) 返回true
	 * @return
	 */
	public static boolean hasError(){
		return !map().get("code").equals(0);
	}
	
	/**
	 * 回收资源
	 */
	public static void remove(){
		maps.remove();
	}
	
	/**
	 * 取得当前数据 
	 * @return
	 */
	public static Map<String, Object> getMap() {
		Map<String, Object> retVal=new LinkedHashMap<String, Object>();
		retVal.putAll(map());//避免修改Map
		return retVal;
	}
	
	/**
	 * 填充有用的数据
	 * @param key
	 * @param value
	 */
	public static void putUsefulData(String key, Object value){
		map().put(key, value);
	}
	
	/**
	 * 填充错误
	 * @param code
	 * @param msg
	 * @param clean true表示清除原有数据
	 */
	public static void putError(int code, String msg, boolean clean){
		if(clean){
			map().clear();
		}
		map().put("code", code);
		map().put("msg", msg);
	}
	
	/**
	 * 填充错误
	 * @param code
	 * @param msg
	 * @param clean true表示清除原有数据
	 */
	public static void putError(int code, String msg){
		putError(code, msg, true);
	}
	
	//==========================================基础============================================
	
	/**
	 * code=-1 : 设置服务器内部错误(500)
	 * @param e 异常
	 * @param errorMsg 异常消息,如果传递null 则为 500:e.getMessage()
	 */
	public static void error(Exception e, String errorMsg){
		log.error("error:", e);
		if(errorMsg == null){
			errorMsg = "500:" + e.getMessage();
		}
		putError(-1, errorMsg);
	}
	
	/**
	 * 填充表单错误
	 * @param msg
	 * @param errors
	 */
	public static void putFormError(String msg, Map<String, String> errors){
		if(msg == null){
			msg = "Form has " + errors.keySet().size() + "Errors";
		}
		putError(-2, msg);
		putUsefulData("errors", errors);
	}
	
	/**
	 * 设置表单错误信息<br/>
	 * code=-2 : 请求参数无效。错误消息里会给出具体哪个参数不合法以及原因。(通常是数据校验,如果是登录,可自行构建错Map传参)
	 * @param errors
	 */
	public static void putFormError(Map<String, String> errors){
		putError(-2, null);
		putUsefulData("errors", errors);
	}
	
	/**
	 * 填充错误
	 * code=-3 : 无API访问权限。
	 */
	public static void putNoPermission(){
		putError(-3, "No Permission!");
	}
	
	/**
	 * 填充错误
	 * code=-4 : 禁止IP访问
	 * @param msg
	 */
	public static void putBanIP(String msg){
		if(msg==null){
			msg = "";
		}
		putError(-4, "Ban IP visit!" + msg);
	}
	
	/**
	 * 填充错误
	 * code=-5 : API不存在
	 * @param msg
	 */
	public static void put404(){
		putError(-5, "Api not exist!");
	}
	
	/**
	 * 填充错误
	 * code=-6 : 访问频率超限
	 * @param msg
	 */
	public static void putBusy(){
		putError(-6, "Access frequency transfinite!");
	}
	
	//==========================================业务============================================
	/**
	 * 填充错误
	 * code=1 : 用户未登录
	 * @param msg
	 */
	public static void putNoLogin(){
		putError(1, "Please Login!");
	}

}
